# 文件读写是通过请求操作系统打开一个文件对象（文件描述符）
# 打开文件进行操作后，还要调用 close 函数关闭
import logging
path = '/Users/rdn/Documents/pythonProjects/python_study/IO/test.txt'
try:
    f = open(path, 'r')
    print(f.read())
except Exception as e:
    logging.exception(e)
finally:
    if f:
        f.close()

# 由于读写文件的过程会发生 IO 错误，而发生错误后程序就终止调用了，但是文件使用完毕后必须关闭才行
# 因此需要用try...finally 块正确关闭文件，但是也可以直接用 with语句来自动调用 close 函数，简化编程
with open(path, 'r') as f:
    print(f.read())

# read()是一次性读取文件所有内容，read(size)是每次最多读取 size 个字节，readlines()是每次读取一行

# 像open()函数返回的这种有个read()方法的对象，在Python中统称为file-like Object。除了file外，还可以是内存的字节流，网络流，自定义流等等。file-like Object不要求从特定类继承，只要写个read()方法就行。
# StringIO就是在内存中创建的file-like Object，常用作临时缓冲。

# 读取二进制文件，采用rb模式打开
# 要读取非UTF-8编码的文件，要在open()函数中加上 encoding 参数
path1 = 'IO/gbk.txt'
with open(path1, 'r', encoding='gbk') as f1:
    print(f1.read())

# 还可以在 open 函数中传入 errors 参数，表示遇到编码错误的情况后如何处理

# 写文件和读文件类似，只不过把模式换成 w 或者 wb

with open(path, 'r') as f:
    s = f.read()
    print(s)



